﻿using FastMvc;
using FastMvc.Auth;
using FastMvc.Crud;
using FastMvc.Models;
using FastMvc.Repositories;
using JQ.SAAS.DTO.JTask;
using JQ.SAAS.Entity;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Test.IService.Tasks;

namespace TestWebServer.Controllers
{
    /// <summary>
    /// Task管理
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [PermissionCheck("Source.JTask", "任务管理")]  // 该Controller下的所有接口，需要有对于Source.JTask的操作权限
    public class JTasksController: CrudController<jtask, JTaskDto,string, JTaskListRequestDto, JTaskCreateDto,JTaskCreateDto>
    {
        private ITaskService _taskService;

        public JTasksController(ITaskService taskService)
            : base(taskService)
        {
            _taskService = taskService;
        }

        /// <summary>
        /// 运行任务
        /// </summary>
        /// <param name="sId">任务Id</param>
        /// <param name="commandDto">运行配置实体</param>
        /// <returns></returns>
        [HttpPost("{sId}/run")]
        [PermissionCheck("Run", "运行")] // 该方法需要由Source.JTask.Run的权限才可以调用
        public async Task<BaseResult<bool>> Run(string sId, [FromBody] JTaskRunCommandDto commandDto)
        {
           var success = await _taskService.RunCommand(commandDto);

            return new BaseResult<bool>()
            {
                success = success,
                code = success ? 0 : 1,
                message = success ? "运行成功！" : "运行失败"
            };
        }

        /// <summary>
        /// 测试用接口
        /// </summary>
        /// <param name="sId">任务Id</param>
        /// <returns></returns>
        [HttpGet("{sid}/getRun")]
        public async Task<BaseResult<string>> GetNewRun(string sId)
        {
            await Task.Delay(10);
            return new BaseResult<string>()
            {
                success =true,
                data = sId,
                message = "111"
            };
        }
    }

    /* Controller路由配置
     * - Route("api/[controller]")样式
     *    可以支持对于在方法上配置[Route("xxx")]时，忽略掉方法名，既action.
     *    但是对于未配置[Route]的方法，这无法默认使用/[action]进行匹配
     * - Route("api/[controller]/[action]")
     *    则可以对于[action]进行默认匹配。
     *    但是对于配置的[Route（"xxx"）]的会被解析为api/controller/action/xxx
     *    
     * 有没有什么两全其美的配置方法呢？
     * 甚至，没有必要在Controller上添加默认的Route，可以按照固定模板进行匹配
     * 同样，方法上也是，若配置的Route，则按照Route匹配，否则按照Controller/action的路由进行匹配
     * 再进一步，可以根据action的开头，默认生成Get/Post方法
     */
}
